package ru.niir.goodfil.exceptions;

import ru.niir.goodfil.utils.validation.ValidationResult;
import ru.niir.goodfil.utils.validation.ValidationError;
import ru.niir.goodfil.utils.validation.ValidationProblem;

/**
 * Исключение возникающее при проверке объекта на наличие ошибок
 */
public class ValidationException extends GoodfilException
{
    /**
     * Результат проверки
     */
    private ValidationResult result;

    /**
     * Конструктор
     * @param result результат проверки
     */
    public ValidationException(ValidationResult result)
    {
        super("Объект " + result.getClassName() + " содержит ошибки: " + result);
        this.result = result;
    }

    /**
     * Конструктор, в который передаются параметры найденой ошибки:
     *  - наименование проверяемого класса
     *  - наименование поля
     *  - значение поля
     *  - тип ошибки
     * @param clas наименование проверяемого класса
     * @param fieldName наименование поля
     * @param fieldValue значение поля
     * @param problem тип ошибки
     * @see ru.niir.goodfil.utils.validation.ValidationError структура хранит информацию о найденой при проверке объекта ошибке
     * @see ru.niir.goodfil.utils.validation.ValidationProblem перечисление возможных ошибюок
     */
    public ValidationException(Class clas, String fieldName, String fieldHumanName, Object fieldValue, ValidationProblem problem)
    {
        super("Объект " + clas.getSimpleName() + " содержит ошибки");

        result = ValidationResult.Error(clas);
        result.addValidationError(new ValidationError(fieldName, fieldHumanName, fieldValue, problem));
    }

    /**
     * Возвращает результат проверки
     * @return результат проверки
     */
    public ValidationResult getResult()
    {
        return result;
    }
}
